define(function(require, exports) {
	var $ = require('jquery');
	var pubjs = require('pubjs');
	var util = require('util');
	var view  = require('@base/view');

	// 活动编辑 —— 广告监测表单 —— 广告位
	var Base = view.container.extend({
		init: function(config) {
			config = pubjs.conf(config, {
				'tplFile': '/tpl/campaign/modules/channelAgent.tpl'
				,'view_model': {
					// 添加广告位按钮点击事件
					evSelectAdBtnClick: this.eventSelectAdBtnClick.bind(this),
					eventShowAddChannel: this.eventShowAddChannel,
					eventHideAddChannel: this.eventHideAddChannel,
					eventSaveChannel: this.eventSaveChannel,
					showAddChannel: false,
					channelName: ''
				}
				,addChannelUrl: 'adSubChannel/add'
				// 活动类型 1 RTB 2代理 3直投，4移动
				,'channelType': 2
				,'url': {
					// 渠道dropdown接口
					'channel': 'adSubChannel/list'
				}
			});

			this.Super('init', arguments);
		}
		,afterBuild: function() {
			var self = this;
			var c = self.getConfig();

			var opts = {
				// 广告位渠道
				channelTip: {
					width: 300
					,data: LANG("广告位所属的渠道，若没有，请先“添加广告位”。")
				}
				// 广告形式
				,adType: {
					'items': {
						1:LANG('硬广'),
						2:LANG('弹窗')
					},
					"selected": 1
				}
				// 广告渠道
				,channel: {
					'width': 300
					,'option_height': 300
					,'reqType': 'websocket'
					,'url': c.url.channel
					,'key': 'id'
					,'name': 'name'
					,'all': {'name': LANG('请选择渠道')}
					,'option_render': self.renderAdChannelItem
					,'isPopUp': false
					,'param': {
						'order': 'CreateTime|-1'
					}
				}
				// 已选广告位列表
				,adList: {
					'cols':[
						{type:'id', width:80}
						// ,{name:'channel', text:'渠道', format:'formatItemName'}
						,{name:'MassMediaName', text:LANG('媒体'), align:'left'}
						,{name:'ads_name', align:'left'}
						,{type:'op', width:50, html:'<a href="#" data-op="remove">'+LANG('删除')+'</a>'}
					]
					,'opClick': true
					,'default_sort': false
					,'emptyText': LANG('请选择添加广告位')
				}
				// 选择广告位窗口
				,selectAd: {
					 'realtime': true
					,'param': {Type: c.channelType}
					,'target': pubjs.DEFAULT_POPUP_CONTAINER
				}
			}

			self.buildFromTemplate(opts);
		}
		,reset: function() {
			this.$adPositions = [];
			this.vm.reset();
			// 按钮组的reset会清空所有，所以此处只需要重置选中值即可
			this.$.adType.setData(1);
			this.$.channel.reset();
			this.$.adList.setData([]);
			this.$.selectAd.reset();
			return this;
		}
		,getData: function() {
			var list = [];
			var channel =  this.$.channel.getData();

			util.each(this.$adPositions, function(item){
				list.push(item._id);
			});

			return {
				'SubChannel': channel ? [channel] : null,
				'AdPositions': list,
				'AdType': this.$.adType.getData(),
				'isExcludePosition': false // 排除广告位选项 (已注释)
			};
		}
		,setData: function(data) {
			this.reset();

			var positions = data.AdPositions;
			var adType = data.AdType;
			var channel = data && data.SubChannel && data.SubChannel[0] || 0;
            var self = this;
			// 广告形式
			if (adType){
				self.$.adType.setData(adType);
			}

			// 广告渠道
			if (channel){
				self.$.channel.setData(channel);
			}

			// 拉取广告位资料
			if (positions && positions.length) {
				self.$adPositions = positions.slice(0);
				self.$.adList.setData(self.$adPositions);
				self.$.selectAd.setValue(self.$adPositions);
			}
			return self;
		}
		,validate: function(data) {
			data = data || this.getData();

			// 检查广告形式和广告位
			if (data.AdType != 1 && data.AdType != 2){
				pubjs.alert(LANG('请先选择广告形式'));
				return false;
			}
			if (data.AdPositions.length <= 0){
				pubjs.alert(LANG('请先选择一个或多个广告位'));
				return false;
			}

			return true;
		}
		// 渠道dropdown渲染回调函数
		,renderAdChannelItem: function(id, opt, dom) {
			var url = opt.Url && opt.Url.replace(/^http[s]?:\/\//i, '') || '';
			url = url.split('/').shift();
			$('<em style="float:right"/>').text(url).appendTo(dom);
			$('<b/>').text(opt.name).appendTo(dom);
		}
		// 移除指定广告位信息
		,removeAdPosition: function(position) {
			var id = position;

			if (position && position._id) {
				id = position._id;
			}

			util.remove(this.$adPositions, position._id, '_id');
			this.$.adList.setData(this.$adPositions);
		}
		// 清空广告位信息
		,emptyAdPosition: function() {
			var self = this;
			self.$adPositions = [];
			self.$.adList.setData([]);
			self.$.selectAd.reset().setValue([]);
		}
		// 选择广告位消息 (全部更新)
		,onSelectAdPosition: function(ev) {
			var data = [];
			util.each(ev.param, function(item) {
				data.push(item);
			});
			this.$adPositions = data;
			this.$.adList.setData(data);
		}
		// 切换不同渠道时的事件
		,onOptionChange: function(ev){
			var self = this;
			var param = ev.param;
			if (self.$adPositions.length > 0){
				pubjs.confirm(LANG('切换渠道, 将会丢失当前广告位设置信息. 要确认切换吗?'), function(res) {
					if (res) {
						self.emptyAdPosition();
						self.fire('changeAgentChannel', param.option);
					} else {
						self.$.channel.setData(param.last);
					}
				});
			}
			return false;
		}
		// 切换广告形式
		,onChangeButton: function(ev) {
			var self = this;
			var type = +ev.param.selected;
			if (self.$adPositions && self.$adPositions.length > 0){
				pubjs.confirm(LANG('切换渠道, 将会丢失当前广告位设置信息. 要确认切换吗?'), function(res) {
					if (res) {
						self.emptyAdPosition();
						self.fire('changeAdType', type);
					} else {
						self.$.adType.setData(ev.param.last);
					}
				});
			}
			else
			{
				self.fire('changeAdType', type);
			}
			return false;
		}
		,onListOpClick: function(ev) {
			// 移除广告位记录
			if (ev.source === this.$.adList && ev.param.op === 'remove') {
				this.removeAdPosition(ev.param.data);
				return false;
			}
		}
		// 选择广告位按钮事件
		,eventSelectAdBtnClick: function() {
			var adType = this.$.adType.getData();
			var channel = this.$.channel.getData(true);
			var channelConfig = this.$.channel.getConfig();

			var ChannelId = channel[channelConfig.key || 'Id'];
			var ChannelName = channel[channelConfig.name || 'Name'];
			if (adType === null){
				return pubjs.alert(LANG('请先选择广告形式.'));
			}
			if (!ChannelId) {
				return pubjs.alert(LANG('请先选择渠道'));
			}

			this.$.selectAd.setValue(this.$adPositions).setParam({
				AdShowTypeEx: +adType,
				ChannelId: ChannelId,
				// XXX: 新建时需要传入渠道名称以显示
				ChannelName: ChannelName
			}).load().show();
		}
		// 以下新建广告监测渠道的部分
		,eventShowAddChannel: function(){
			this.vm.$.showAddChannel = !this.vm.$.showAddChannel;
			this.vm.$.channelName = '';
		}
		,eventHideAddChannel: function(){
			this.vm.$.showAddChannel = false;
			this.vm.$.channelName = '';
		}
		,eventSaveChannel: function(){
			var self = this;
			var channelName = self.vm.$.channelName;
			if (!channelName) {
				pubjs.alert(LANG('请填写渠道名字'));
				return false;
			}
			var url = self.getConfig('addChannelUrl');
			pubjs.mc.send(
				url,
				{
					'Name': channelName
				},
				self.onSaveChannel.bind(self)
			);
		}
		,onSaveChannel: function(err, data){
			var self = this;
			if (err) {
				pubjs.alert(err.message);
				return false;
			}
			self.$.channel.reload();
			self.$.channel.setData(data._id);
			self.vm.$.channelName = '';
			self.vm.$.showAddChannel = false;
		}
	});

	exports.base = Base;
});